package SDS;

public class SDS {
    private int len; // 当前字符串的长度
    private int alloc; // 当前分配的内存大小
    private char[] buf; // 存储实际字符串数据

    public SDS(String str) {
        this.len = str.length();
        this.alloc = Math.max(len, 16);
        this.buf = new char[alloc];
        System.arraycopy(str.toCharArray(), 0, buf, 0, len);
    }

    // 向SDS追加字符串
    public void append(String str) {
        // 判断内存是否足够
        int newLen = len + str.length();
        if (newLen > alloc) extend(newLen);
        System.arraycopy(str.toCharArray(), 0, buf, len, str.length());
        len = newLen;
    }

    private void extend(int newLen) {
        // 1MB（即 1024 * 1024 字节）等于 1048576 字节。 每个 char 占用 2 字节（16 位），因此 1MB 能够存储的字符数量是 524288
        int _1MBLen = 1024 * 1024 / 2;

        // 如果新长度小于1M，则分配原长度的两倍 + 1
        if (newLen < _1MBLen) {
            newLen = newLen * 2 + 1;
        }

        // 如果新长度大于1M，则分配 1M + 1 字符
        else {
            newLen = _1MBLen + 1;
        }

        char[] newBuf = new char[newLen];
        System.arraycopy(buf, 0, newBuf, 0, len);
        buf = newBuf;
        alloc = newLen;

        System.out.println("扩展内存成功，申请的长度为：" + alloc); // 扩展内存成功，申请的长度为：67
    }

    // 返回当前SDS的字符串表示
    public String getAllData() {
        return new String(buf, 0, len);
    }
}
